Trafico de datos en tiempo de SARS-COV-II

Carlos Sebastian Madrigal Rodriguez

2/7/2021


logo

Tras el brote de la COVID-19, cada vez más personas trabajan, estudian y socializan desde sus casas. A lo largo de la cadena de valor de Internet, los operadores de comunicaciones, los proveedores de contenido y servicios en la nube, así como también los puntos de intercambio de Internet (IXP), han experimentado hasta un 60% más de tráfico de Internet en comparación con el tráfico previo al brote. En esta situación sin precedentes, la resiliencia y la capacidad de las redes de banda ancha se han vuelto aún más esenciales. consulte mas aqui

La base de datos proporcionada, nos brinda la cantidad de datos (en GB) que circulan a traves de distintos proveedores de servicios digitales por medio de su infraestructura de red. Este dataset contempla distintos provedores que pueden presentar correlacion entre ellos, por lo cual podrian ser omitidos para evitar estudiar informacion muy parecida en las series.

  #Lectura de los datos del archivo csv.
  datos_internet <- read.csv("Monitoreo de Tráfico de Internet_2.csv", header = TRUE,
                  sep = ",", check.names = FALSE)
  datos_internet <- datos_internet %>% select(Fecha, Proveedor, Trafico_Datos_Local)
  datos_internet <- mutate(datos_internet, Fecha = as.Date(Fecha, "%m/%d/%Y"), 
                           Trafico_Datos_Local = as.numeric(Trafico_Datos_Local))

De todos los proveedores, seleccionaremos a los 3 que mas datos generan de manera local asi como 1 de los que menos generan.

  #Grafica de area.
  ggplot(datos_internet, aes(x = Fecha, y = Trafico_Datos_Local)) +
  geom_area(aes(color = Proveedor, fill = Proveedor),
  alpha = 0.5, position=position_dodge(0.8)) +
  ggtitle("Trafico de datos durante la pandemia") +
  xlab("Mes 2020") +
  ylab("Datos en GB") +
  theme_minimal() +
  scale_color_manual(values=c("#00AFBB", "#E7B800", "#CC0000", "#006600", 
                              "#669999", "#00CCCC", "#660099", "#FC0066", 
                              "#AF9999", "#FE99FF", "#559955", "#A990CC", 
                              "#660099", "#CC0066")) +
  scale_fill_manual(values=c( "#00AFBB", "#E7B800", "#CC0000", "#006600", 
                              "#669999", "#00CCCC", "#660099", "#FC0066", 
                              "#AF9999", "#FE99FF", "#559955", "#A990CC", 
                              "#660099", "#CC0066"))

En este caso fueron seleccionados: Movistar, Unefon, Clarovideo y DirecTV.


Series de tiempo.

Vayamos a realizar un analisis ganeral de las series de tiempo que nos proporcionan los proveeedores de servicios. Tras observar cada una de las series, se puede llegar a un punto en comun, todas tienen puntos de inflexion cerca de los meses de Julio, Agosto y Enero, ya que estos son los meses de transicion de vacaciones a clases/trabajo o viceversa por parte de estudiantes o trabajadores; Por motivos de la pandemia, el regreso a labores se debe de realizar de manera puramente virtual y en algunos escasos casos de manera semipresencial. ¿A que va esto?, pues a que todo mundo ahorita depende de servicios de internet o de entretenimiento ya que por decreto oficial, nadie deberia de salir de su casa.

NOTA. Los datos atipicos de las graficas fueron “Normalizados”, sustituyendo el dato por el promedio del dato de un dia anterior con el de un dia posterior, esto con el fin de brindar un buen modelo de prediccion.

grafica_movi <- ggplot(movistar) +
  geom_line(aes(x=Fecha, y= Trafico_Datos_Local), color="green", size=0.8) +
  geom_point(aes(x=Fecha, y= Trafico_Datos_Local), size=1) +
  ggtitle("Movistar") +
  labs(x="Tiempo", y="Datos (GB)") +
  theme_bw() +
  theme(plot.title = element_text(hjust = 0.5))
ggplotly(grafica_movi)

Antes que nada, se debe aclarar que la compañia “Movistar” es una empresa de servicios telefonia movil, cuyo proposito es comunicar a los cientos de miles de mexicanos con el mundo exterior y de manera local. En esta grafica se puede observar el alce de la demanda de servicios telefonicos justo cuando empezo el periodo vacacional y una caida una vez se regreso a dias laborales.

grafica_une <- ggplot(une) +
  geom_line(aes(x=Fecha, y= Trafico_Datos_Local), color="yellow", size=0.8) +
  geom_point(aes(x=Fecha, y= Trafico_Datos_Local), size=1) +
  ggtitle("Unefon") +
  labs(x="Tiempo", y="Datos (GB)") +
  theme_bw() +
  theme(plot.title = element_text(hjust = 0.5))
ggplotly(grafica_une)

Como dato previo al analisis, se debe aclarar que la compañia “Unefon” es una empresa de servicios telefonia movil, cuyo proposito es comunicar a los cientos de miles de mexicanos con el mundo exterior y de manera local. En esta grafica se puede observar la misma demanda que tuvo movistar, pero con una mayor cantidad de usuarios asociados a esta telefonia al principio, tambien demuestra el alce de la demanda de servicios telefonicos justo cuando empezo el periodo vacacional y una caida una vez se regreso a dias laborales.

grafica_claro <- ggplot(claro) +
  geom_line(aes(x=Fecha, y= Trafico_Datos_Local), color="red", size=0.8) +
  geom_point(aes(x=Fecha, y= Trafico_Datos_Local), size=1) +
  ggtitle("Claro") +
  labs(x="Tiempo", y="Datos (GB)") +
  theme_bw() +
  theme(plot.title = element_text(hjust = 0.5))
ggplotly(grafica_claro)

Como dato previo, se debe aclarar que la compañia “Claro” es una empresa de servicios internet y telefonia fija, asi como servicios de entretenimiento en linea, cuyo proposito es de brindar un servicio total a sus clientes. En esta grafica se puede observar un cambio significativo con respecto a las empresas anteriores, como esta es una empresa mas orientado a lo “fijo” y al entretenimiento, por motivos de confinamiento agarro mas fuerza y tuvo un incremento desde el inicio de la pandemia; como las personas se la pasan en su hogar, necesitan una forma de pasar el tiempo y que mejor con los servicios de entretenimiento qye ofrece esta empresa y ademas, si estas en casa, no hay necesidad de tener un plan movil de internet si ya tienes internet fijo.

grafica_directv <- ggplot(directv) +
  geom_line(aes(x=Fecha, y= Trafico_Datos_Local), color="blue", size=0.8) +
  geom_point(aes(x=Fecha, y= Trafico_Datos_Local), size=1) +
  ggtitle("Directv") +
  labs(x="Tiempo", y="Datos (GB)") +
  theme_bw() +
  theme(plot.title = element_text(hjust = 0.5))
ggplotly(grafica_directv)

Como dato previo, se debe aclarar que la compañia “Directv” es una empresa de servicios de television por cable, cuyo proposito es de brindar canales exclusivos que no se pueden obtener a traves de television abierta a sus clientes. En esta grafica se puede observar un cambio significativo con respecto a las empresas anteriores, y un comportamiento casi contrario con respecto a Claro, ya que esta tambien provee servicio de entretenimiento, pero ¿Porque?. Muy facil!, el internet agarro gran fuerza, reemplazando asi la television abierta y por cable desde el momento en que salio y empresas exclusivas de entretenimiento que solo pueden ser visitados a traves de internet y de popularidad masiva, aprovecharon la pandemia para lanzar una gran cantidad de espectaculos, logrando asi que muchas personas que tenian television por cable, cancelaran el servicio porque en internet podian encontrar mas variedad y hasta los mismos programas por un precio mas barato o inclusive gratis!

Como breve conclusion de las graficas anteriores, Ante el confinamiento, los servicios de telefonía e internet fijos así como la TV de paga fueron los servicios que tomaron mayor fuerza al elevar sus ingresos y captar más clientes.


Modelos y Predicciones.

Es importante recordar que, al ajustar un modelo, los residuales de este deben comportarse como ruido blanco.

Movistar.

Para la empresa Movistar, se realizo una serie de tiempo, asi como uso de la la función auto.arima para ajustar el mejor modelo posible a los datos. Para comprobar que es un buen modelo, se hizo el test Ljung-Box.

  ts_movistar = ts(movistar$Trafico_Datos_Local, start = c(2020,3,30),
                      end = c(2021,1,26), frequency = 305)

  modelo_arima_movistar <- auto.arima(ts_movistar)
  summary(modelo_arima_movistar)
  Series: ts_movistar 
  ARIMA(2,1,2) 
  
  Coefficients:
           ar1      ar2      ma1     ma2
        1.2261  -0.9438  -1.3585  0.8792
  s.e.  0.0318   0.0376   0.0285  0.0521
  
  sigma^2 estimated as 495865982:  log likelihood=-3462.44
  AIC=6934.88   AICc=6935.09   BIC=6953.45
  
  Training set error measures:
                     ME     RMSE      MAE         MPE     MAPE MASE       ACF1
  Training set 218.0964 22084.16 17076.06 -0.07347595 3.377077  NaN -0.2521025

Test Ljung-Box:

  #Ver si es un buen modelo.
  Box.test(residuals(modelo_arima_movistar), type = 'Ljung-Box')
  
    Box-Ljung test
  
  data:  residuals(modelo_arima_movistar)
  X-squared = 19.512, df = 1, p-value = 9.996e-06

Media de los residuales del modelo:

  mean(na.omit(residuals(modelo_arima_movistar)))
  [1] 218.0964

Se puede observar que el ajuste arrojo un modelo ARIMA (2,1,2), con 2 componentes autorregresivos, 2 medias móviles y una diferencia, Sin embargo notamos que la prueba Ljung-Box obtuvo un p_value = 9.996e-06, lo cual nos indica por contraste de hipotesis que los residuales no se comportan como ruido blanco; por lo que el modelo no puede ser usado para predecir. Ademas de esto, la media de los residuales es de 218.09, mientras que idealmente este valor debe de aproximarse a cero.

Para obtener un modelo que nos sirva para predicciones y para corregir la media de los residuales, usaremos medias móviles de orden 2 para suavizar la serie; ya evaluada la serie de tiempo, se logro obtener los siguientes resultados:

  ts_movistar = ts(movistar$Trafico_Datos_Local, start = c(2020,3,30),
                      end = c(2021,1,26), frequency = 305)

  #Suavizamos el modelo para obtener una mejor prediccion.
  ma_ts_movistar <- ma(ts_movistar,2)

  modelo_arima_movistar <- auto.arima(ma_ts_movistar)
  summary(modelo_arima_movistar)
  Series: ma_ts_movistar 
  ARIMA(2,1,0) with drift 
  
  Coefficients:
           ar1      ar2     drift
        0.8830  -0.7363  327.0304
  s.e.  0.0397   0.0396  592.8968
  
  sigma^2 estimated as 77445501:  log likelihood=-3160.37
  AIC=6328.74   AICc=6328.87   BIC=6343.56
  
  Training set error measures:
                     ME     RMSE      MAE       MPE     MAPE MASE       ACF1
  Training set 12.95543 8741.838 7193.542 0.0220436 1.433119  NaN 0.02727393

Test Ljung-Box para el modelo suavizado:

  #Ver si es un buen modelo.
  Box.test(residuals(modelo_arima_movistar), type = 'Ljung-Box')
  
    Box-Ljung test
  
  data:  residuals(modelo_arima_movistar)
  X-squared = 0.22689, df = 1, p-value = 0.6338

Media de los residuales del modelo suavizado:

  mean(na.omit(residuals(modelo_arima_movistar)))
  [1] 12.95543

Tras realizar estas modificaciones, el nuevo ajuste nos arrojo un modelo ARIMA(2,1,0) con 2 componentes autorregresivos, 0 medias móviles y una diferencia. Ahora tras realizar la prueba Ljung-Box se obtuvo un p_value = 0.6338, lo cual nos indica que los residuales se comportan como ruido blanco y es un modelo que se puede usar para realizar pronosticos. Ademas de esto, la media de los residuales se redujo considerablemente a un valor de 12.95.

Tras haber ajustado el modelo, se pudo obtener el siguiente pronostico:

  #Ver si es un buen modelo.
  prediccion_movistar <- forecast(modelo_arima_movistar,10,level=95)
  plot(prediccion_movistar, main="Pronostico para Movistar.")

Claro

Para la empresa “Claro”, al igual que la empresa anterior, se realizo una serie de tiempo, asi como uso de la función auto.arima para ajustar el mejor modelo posible a los datos. Para comprobar que es un buen modelo, se hizo el test de Ljung-Box.

  ts_claro = ts(claro$Trafico_Datos_Local, start = c(2020,3,30),
              end = c(2021,1,26), frequency=305)
  modelo_arima_claro <- Arima(ts_claro, order = c(3,2,2))
  summary(modelo_arima_claro)
  Series: ts_claro 
  ARIMA(3,2,2) 
  
  Coefficients:
           ar1      ar2      ar3      ma1     ma2
        0.4597  -0.2298  -0.3165  -1.8154  0.8304
  s.e.  0.0623   0.0602   0.0597   0.0371  0.0367
  
  sigma^2 estimated as 4.065e+09:  log likelihood=-3770.64
  AIC=7553.28   AICc=7553.57   BIC=7575.54
  
  Training set error measures:
                      ME    RMSE      MAE        MPE     MAPE MASE        ACF1
  Training set -32.53311 63016.1 50555.39 -0.2353234 4.757215  NaN -0.08174628
  #Ver si es un buen modelo.
  Box.test(residuals(modelo_arima_claro), type = 'Ljung-Box')
  
    Box-Ljung test
  
  data:  residuals(modelo_arima_claro)
  X-squared = 2.0516, df = 1, p-value = 0.152
  #Ver si es un buen modelo.
  prediccion_claro <- forecast(modelo_arima_claro,10,level=95)
  plot(prediccion_claro, main="Pronostico para Claro")

  ts_unefon = ts(une$Trafico_Datos_Local,start = c(2020,3,30),
                     end = c(2021,1,26), frequency=305)
  modelo_arima_unefon <- auto.arima(ts_unefon)
  summary(modelo_arima_unefon)
  Series: ts_unefon 
  ARIMA(4,1,2) 
  
  Coefficients:
           ar1      ar2      ar3      ar4      ma1     ma2
        0.6498  -0.5720  -0.1813  -0.3071  -1.1905  0.7929
  s.e.  0.0707   0.0722   0.0674   0.0618   0.0471  0.0644
  
  sigma^2 estimated as 1.324e+09:  log likelihood=-3610.48
  AIC=7234.95   AICc=7235.33   BIC=7260.95
  
  Training set error measures:
                     ME     RMSE      MAE        MPE     MAPE MASE       ACF1
  Training set 106.0698 35969.85 28333.74 -0.1381419 3.491657  NaN -0.0307313
  #Ver si es un buen modelo.
  Box.test(residuals(modelo_arima_unefon), type = 'Ljung-Box')
  
    Box-Ljung test
  
  data:  residuals(modelo_arima_unefon)
  X-squared = 0.28994, df = 1, p-value = 0.5903
  #Ver si es un buen modelo.
  prediccion_unefon <- forecast(modelo_arima_unefon, 12, level=95)
  plot(prediccion_unefon, main="Pronostico para Unefon")

  ts_directv = ts(directv$Trafico_Datos_Local, start = c(2020,3,30),
                end = c(2021,1,26), frequency=305)
  modelo_arima_directv <- auto.arima(ts_directv, seasonal=TRUE)
  summary(modelo_arima_directv)
  Series: ts_directv 
  ARIMA(2,1,2) with drift 
  
  Coefficients:
           ar1     ar2      ma1     ma2    drift
        1.1069  -0.663  -1.3949  0.5808  -8.5755
  s.e.  0.0692   0.064   0.0727  0.0709  35.1089
  
  sigma^2 estimated as 3362602:  log likelihood=-2704.81
  AIC=5421.62   AICc=5421.9   BIC=5443.9
  
  Training set error measures:
                     ME     RMSE     MAE        MPE     MAPE MASE        ACF1
  Training set 11.12746 1815.554 1440.87 -0.0728653 2.683842  NaN -0.07059401
  #Ver si es un buen modelo.
  Box.test(residuals(modelo_arima_directv), type = 'Ljung-Box')
  
    Box-Ljung test
  
  data:  residuals(modelo_arima_directv)
  X-squared = 1.53, df = 1, p-value = 0.2161
  #Ver si es un buen modelo.
  prediccion_directv <- forecast(modelo_arima_directv, 12, level=95)
  plot(prediccion_directv, main="Pronostico para Directv")